/**
 * @file msgData.h
 * @brief Fichero de cabeceras de la biblioteca auxiliar de Nivel 2.
 *
 * Fichero que contiene las cabeceras de las funciones de la
 * biblioteca auxiliar de Nivel 2, para la gestion del soporte de datagramas.
*/
 
#include <stdlib.h>
#include "nivel1a.h"

#ifndef MSG_DATA_H
#define MSG_DATA_H
 
typedef struct _msgData *MSG_DATA;											/*!< EdD soporte para mensajes*/
typedef enum{OK, ERR, EMPTY, FULL} ERR_CODE;								/*!< Codigos de error internos a la biblioteca de soporte de nivel 2*/
 
/**
* @brief Crea una EdD para soporte de mensajes.
*
* @return MSG_DATA creado, NULL si error.
*/
MSG_DATA iniMsgData();

/**
* @brief Libera el soporte de mensajes, desalocando los recursos reservados.
*
* @param msgData Soporte de mensajes sobre el que ejecutar la liberacion.
*/
void freeMsgData(MSG_DATA msgData);

/**
* @brief Limpia el soporte de mensajes.
*
* Nota: Esta operacion no libera los recursos requisados. Por tanto, puede
* ser utilizado con normalidad la EdD tras la limpieza.
* Para liberar los recursos, llamese a freeMsgData.
*
* @param msgData Soporte de mensajes sobre el que ejecutar la limpieza.
*/
void cleanMsgData(MSG_DATA msgData);

/**
* @brief Inserta un datagrama.
*
* Nota: Por robustez, la EdD efectua una copia de los datos.
* Por tanto, tras la insercción, los datos parametro pueden ser manipulados libremente
* sin comprometer la coherencia de la EdD.
*
* @param msgData Soporte de mensajes sobre el que ejecutar la insercion.
* @param msg Datagrama a insertar.
* @param size Tamanno del datagrama a insertar.
* @return OK si correcto, ERR si error.
*/
ERR_CODE insertMsgData(MSG_DATA msgData, BYTE *msg, size_t size);

/**
* @brief Retorna el mensaje almacenado en la EdD soporte.
*
* Nota: La EdD no efectua una copia de los datos. Si se desea manipularlos
* externamente, es necesario invocar una copia explicita.
*
* @param msgData Soporte de mensajes sobre el que ejecutar la consulta.
* @return Puntero al array de BYTE's del datagrama.
*/
BYTE *getMsgMsgData(MSG_DATA msgData);

/**
* @brief Retorna el tamanno del mensaje almacenado en la EdD soporte.
*
* @param msgData Soporte de mensajes sobre el que ejecutar la consulta.
* @return Tamanno del mensaje almacenado.
*/
size_t getSizeMsgData(MSG_DATA msgData);

/**
* @brief Copia la EdD soporte src a dst.
*
* @param dst Destino de la copia.
* @param src Origen de la copia.
* @return OK si correcto, ERR si error.
*/
ERR_CODE cpyMsgData(MSG_DATA dst, MSG_DATA src);

#endif
